/**
 * @typedef SafeArea
 * @property {number} left 去除状态栏后，左上角横坐标
 * @property {number} right 去除状态栏后，右下角横坐标
 * @property {number} top 去除状态栏后，左上脚纵坐标
 * @property {number} bottom 去除状态栏后，右下角纵坐标
 * @property {number} width 去除状态栏后，宽度 px
 * @property {number} height 去除状态栏后，高度 px
 */

/**
 * @typedef WindowInfo
 * @property {number} pixelRatio 设备像素比
 * @property {number} screenWidth 屏幕宽度，单位 px
 * @property {number} screenHeight 屏幕高度，单位 px
 * @property {number} windowWidth 可使用窗口宽度，单位 px
 * @property {number} windowHeight 可使用窗口高度，单位 px
 * @property {number} statusBarHeight 状态栏高度，单位 px
 * @property {SafeArea} safeArea 安全区域信息
 * @property {number} screenTop 窗口上边缘的y值，单位 px
 */

/**
 * @typedef MenuButtonInfo
 * @property {number} width 胶囊宽度，单位 px
 * @property {number} height 胶囊高度，单位 px
 * @property {number} top 上边界坐标，单位 px
 * @property {number} right 右边界坐标，单位 px
 * @property {number} bottom 下边界坐标，单位 px
 * @property {number} left 左边界坐标，单位 px
 *
 */

/**
 * @classdesc - 顶部高度及位置的相关信息
 * @class
 */
export default class TopInfo {
    /**
     * 获取窗口信息
     * @returns {WindowInfo} 窗口信息
     */
    static getWindowInfo() {
        return wx.getWindowInfo()
    }

    /**
     * 获取安全区信息
     * @returns {SafeArea} 安全区信息
     */
    static getSafeAreaInfo() {
        return TopInfo.getWindowInfo().safeArea
    }

    /**
     * 获取胶囊信息
     * @returns {MenuButtonInfo} 胶囊信息
     */
    static getMenuButtonInfo() {
        return wx.getMenuButtonBoundingClientRect()
    }

    /**
     * 获取状态栏高度
     * @returns {number} 状态栏高度，单位 px
     */
    static getStatusBarHeight() {
        return this.getWindowInfo().statusBarHeight
    }

    /**
     * 获取状态栏与胶囊的间距
     * @returns {number} 状态栏与胶囊的间距，单位 px
     */
    static getStatusBarToMenuButtonGap() {
        return this.getMenuButtonInfo().top - this.getWindowInfo().statusBarHeight
    }

    /**
     * 获取胶囊高度
     * @returns {number} 胶囊高度，单位 px
     */
    static getMenuButtonHeight() {
        return this.getMenuButtonInfo().height
    }

    /**
     * 获取胶囊下边界
     * @returns {number} 下边界坐标，单位 px
     */
    static getMenuButtonBottom() {
        return this.getMenuButtonInfo().bottom
    }

    /**
     * 获取屏幕高度
     * @returns {number} 屏幕高度，单位 px
     */
    static getScreenHeight() {
        return this.getWindowInfo().screenHeight
    }

    /**
     * 获取下方可用区域
     * @returns {number} 下方可用区域，单位px
     */
    static getBodyHeight() {
        return this.getScreenHeight() - this.getMenuButtonBottom()
    }
}